home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Internet / News / Alexandra.0.82 / Source / NntpPanelControl.m < prev    next >
Encoding:
Text File  |  1996-01-30  |  13.7 KB  |  591 lines

  1.  
  2. #import "NntpPanelControl.h"
  3. #import "ServerCell.h"
  4. #import "MainWindowControl.h"
  5. #import "NNTP.h"
  6. #import "ArticleSet.h"
  7. #import "NewsgroupSet.h"
  8. #import "KillFilePanel.subproj/KillPanelController.h"
  9. #import "descriptors.h"
  10. #import "ArticleViewControl.h"
  11. #include "regexpr.h"
  12. #import "Alexandra.h"
  13. #import "Composer.h"
  14.  
  15. @implementation NntpPanelControl
  16.  
  17. void handler(DPSTimedEntry te,double now, char *userData)
  18. {
  19.     [((id)userData) newNewsAllServer:(id)userData];
  20. }
  21.  
  22. - appWillTerminate:sender
  23. {
  24.    int i,j;
  25.     id result=self;
  26.     
  27.     result=[Composer confirmTermination];
  28.     if(result){
  29.        for(i=0,j=[nrList count];i<j;i++)
  30.           [[nrList objectAt:i] free];
  31.     }    
  32.   
  33.     return result;
  34. }
  35.  
  36.  
  37. - appDidBecomeActive:sender;
  38.     {
  39.     if([NXApp defaultBoolValue:DEFAULT_CHECKNN_ACTIVATION]){
  40.         [self renewNewNewsTimedEntry:self];
  41.         [self newNewsAllServer:self];
  42.     }
  43.         //[NXApp sendAction:@selector(newNews:) to:nil from:self];
  44.         
  45.     return self;
  46.     }
  47.     
  48.  
  49. - app:sender powerOffIn:(int)ms andSave:(BOOL)save
  50. {
  51.    int i,j;
  52.  
  53.    for(i=0,j=[nrList count];i<j;i++)
  54.       [[nrList objectAt:i] free];
  55.   
  56.     return self;
  57. }
  58.  
  59. - setupMenu:menu;
  60.     {
  61.     id        aCell,aMenu;
  62.     int        n,i;
  63.     
  64.     aMenu=[[menu itemList] cellList];
  65.     n=[aMenu count];
  66.     for(i=0;i<n;i++)
  67.         {
  68.         aCell=[aMenu objectAt:i];
  69.           if(![aCell isEnabled])
  70.             {
  71.             [aCell setEnabled:TRUE];
  72.              if([aCell hasSubmenu])
  73.                 [self setupMenu:[aCell target]];
  74.             else
  75.                 {
  76.                 [aCell setUpdateAction:@selector(menuActive:) forMenu:menu];
  77.                 }
  78.              }
  79.           }
  80.     return self;
  81.        }
  82.     
  83.  
  84.  
  85. - appDidInit:sender
  86. {
  87.    const char *buf;
  88.    BOOL openServers;
  89.    NXSize newCellSize,cellDist;
  90.    NXRect frameRect;
  91.    ServerCell *aCell;
  92.  
  93.    openServers=FALSE;
  94.  
  95.    nrList=[[List alloc] init];
  96.    [serverNameMatrix getFrame:&frameRect];
  97.    newCellSize.height=16.0;
  98.    newCellSize.width = frameRect.size.width;
  99.    cellDist.width=0.0;
  100.    cellDist.height=0.0;
  101.  
  102.    [[serverNameMatrix superview] setAutoresizeSubviews:YES];
  103.    [serverNameMatrix setAutosizing:NX_WIDTHSIZABLE];
  104.    [serverNameMatrix setAutosizeCells:YES];
  105.    [serverNameMatrix setIntercell:&cellDist];
  106.    [[serverNameMatrix setCellSize:&newCellSize] setMode:NX_RADIOMODE];
  107.    [serverNameMatrix setMode:NX_RADIOMODE];
  108.    [serverNameMatrix setEmptySelectionEnabled:YES];
  109.    [serverNameMatrix setDoubleAction:[openButton action]];
  110.  
  111.    aCell=[[ServerCell alloc] init];
  112.    [[[aCell setSlowLink:FALSE] setOpenOnStartup:FALSE] serverClosed:self];
  113.    [serverNameMatrix setPrototype:aCell];
  114.  
  115.    [self setupMenu:mainMenu];
  116.    [NXApp setAutoupdate:TRUE];
  117.  
  118.    //insert servernames in matrix
  119.    if(((buf=[NXApp defaultValue:"NNTPServer"])!=NULL)&&(*buf!='\0')){
  120.       List *cellList;
  121.       int i,j;
  122.  
  123.       if(buf[0]=='\0')
  124.          return self;
  125.       [self addCellsToMatrix:buf];
  126.       cellList=[serverNameMatrix cellList];
  127.       j=[cellList count];
  128.       for(i=0;i<j;i++){
  129.          id aCell=[cellList objectAt:i];
  130.          [aCell readServerOptions];
  131.          if([aCell openOnStartup]==TRUE){
  132.             [serverNameMatrix selectCellAt:i:0];
  133.             [self openServer:self];
  134.             openServers=TRUE;
  135.          }
  136.       }
  137.       if(openServers==TRUE){
  138.          [serverNameMatrix selectCellAt:-1:-1];
  139.       }
  140.    }
  141.    if(openServers==FALSE)
  142.       [[serverNameMatrix window] makeKeyAndOrderFront:self];
  143.  
  144.    //which regular expression syntax to use?
  145.    buf=[NXApp defaultValue:"RegExprSyntax"];
  146.    if(buf!=NULL){
  147.       if(!strcasecmp(buf,"EMACS"))
  148.          re_set_syntax(RE_SYNTAX_EMACS);
  149.       if(!strcasecmp(buf,"AWK"))
  150.          re_set_syntax(RE_SYNTAX_AWK);
  151.       else if(!strcasecmp(buf,"EGREP"))
  152.          re_set_syntax(RE_SYNTAX_EGREP);
  153.       else if(!strcasecmp(buf,"GREP"))
  154.          re_set_syntax(RE_SYNTAX_GREP);
  155.    }
  156.  
  157.     [ERROR_MANAGER addObserver:self 
  158.                         selector:@selector(renewNewNewsTimedEntry:)
  159.                         forError:ENOTEPrefsChanged];
  160.                         
  161.     [self renewNewNewsTimedEntry:self];
  162.     
  163.     [[NXApp appListener] setServicesDelegate:self];
  164.      
  165.    return self;
  166.  
  167. - addCellsToMatrix:(const char *)serverlist
  168. {
  169.    char buf[200];
  170.    const char *ptr;
  171.    int r,c;
  172.    id aCell;
  173.  
  174.    ptr=serverlist;
  175.    while((ptr!=NULL)&&(ptr[0]!='\0')){
  176.       sscanf(ptr,"%s",buf);
  177.       [serverNameMatrix getNumRows:&r numCols:&c];
  178.       [serverNameMatrix addRow];
  179.       aCell=[serverNameMatrix cellAt:r :0];
  180.       [aCell setStringValue:buf];
  181.  
  182.       ptr+=strlen(buf);
  183.       if(ptr[0]==' ')
  184.          ptr++;
  185.    }
  186.    [serverNameMatrix sizeToCells];
  187.     
  188.    return self;
  189. }
  190.  
  191. - addNewServer:sender
  192. {
  193.    int i;
  194.    int r,c;
  195.    ServerCell *aCell;
  196.    const char *aString;
  197.  
  198.    aString=[newServerName stringValue];
  199.     if(strchr(aString,' ')){
  200.         NXRunAlertPanel("ALEXANDRA","No space characters allowed in the nntp server name.",NULL,NULL,NULL);
  201.         return self;
  202.     }
  203.    if(aString[0]!='\0'){
  204.       [serverNameMatrix getNumRows:&r numCols:&c];
  205.       for(i=0;i<r;i++)
  206.          if(strcmp([[serverNameMatrix cellAt:i :0] stringValue],aString)==0)
  207.             return self;
  208.       [self addCellsToMatrix:aString];
  209.       aCell=[serverNameMatrix cellAt:r :0];
  210.       [aCell setOpenOnStartup:([newServerOOS state]==1)];
  211.       [aCell setSlowLink:([newServerSL state]==1)];
  212.         [aCell setUserString:[newServerUser stringValue] ];
  213.       [aCell setPasswdString:[newServerPassword stringValue] ];
  214.       [serverNameMatrix display];
  215.       [self addServerToDefaultDB:aString];
  216.       [aCell writeServerOptions];
  217.    }
  218.    [[newServerName controlView] selectTextAt:0];
  219.    return self;
  220. }
  221.  
  222. - serverWillClose:sender
  223. {
  224.    int i,j;
  225.    List *cellList;
  226.    const char *servername=[[sender nntpServer] serverName];
  227.  
  228.    cellList=[serverNameMatrix cellList];
  229.    j=[cellList count];
  230.    for(i=0;i<j;i++){
  231.       ServerCell *aCell=[cellList objectAt:i];
  232.       if(strcmp([aCell stringValue],servername)==0){
  233.          [aCell serverClosed:self];
  234.          break;
  235.       }
  236.    }
  237.    [nrList removeObject:sender];
  238.    [serverNameMatrix display];
  239.  
  240.    return self;
  241. }
  242.  
  243. - openServer:sender
  244. {
  245.    int i,j;
  246.  
  247.    [serverNameMatrix getNumRows:&j numCols:&i];
  248.    for(i=0;i<j;i++){
  249.       ServerCell *aCell=[serverNameMatrix cellAt:i :0];
  250.       if(([aCell state]==1)&&([aCell isOpen]==FALSE)){
  251.          //open server
  252.          if(starter==nil)
  253.             if([NXApp loadNibSection:"newsreader.nib" owner:self withNames:NO]==nil)
  254.                return nil;
  255.          if([starter connectNNTP:[aCell stringValue] slowLink:[aCell slowLink]]==TRUE){
  256.             [nrList addObject:starter];
  257.             [aCell serverOpened:self];
  258.             starter=nil;
  259.          }
  260.       }
  261.    }
  262.    [serverNameMatrix display];
  263.    return self;
  264. }
  265.  
  266. - removeServer:sender
  267. {
  268.    int i,j;
  269.  
  270.     [serverNameMatrix getNumRows:&j numCols:&i];
  271.    for(i=j-1;i>=0;i--){
  272.       ServerCell *aCell=[serverNameMatrix cellAt:i :0];
  273.       if(([aCell state]==1)&&([aCell isOpen]==FALSE)){
  274.          [self removeServerFromDefaultDB:[aCell stringValue]];
  275.          [serverNameMatrix removeRowAt:i andFree:YES];
  276.       }
  277.    }
  278.    [[serverNameMatrix sizeToCells] display];
  279.    [self serverSelected:self];
  280.    return self;
  281. }
  282.  
  283. - serverSelected:sender
  284. {
  285.    List *selList;
  286.    int j;
  287.    
  288.    selList=[serverNameMatrix getSelectedCells:nil];
  289.    j=[selList count];
  290.    if(j==1){
  291.       ServerCell *aCell=[selList objectAt:0];
  292.       [[newServerOOS setState:(int)[aCell openOnStartup]] display];
  293.       [[newServerSL setState:(int)[aCell slowLink]] display];
  294.         [newServerUser setStringValue:[aCell user]];
  295.         [newServerPassword setStringValue:[aCell pass]];
  296.       [newServerName takeStringValueFrom:[selList lastObject]];
  297.       [[newServerName controlView] selectTextAt:0];
  298.       [openButton setEnabled:![aCell isOpen]];
  299.         [removeButton setEnabled:![aCell isOpen]]; 
  300.    }
  301.    else {
  302.       [[newServerOOS setState:0] display];
  303.       [[newServerSL setState:0] display];
  304.       [newServerName setStringValue:""];
  305.         [newServerPassword setStringValue:""];
  306.         [newServerUser setStringValue:""];
  307.       [openButton setEnabled:FALSE];
  308.         [removeButton setEnabled:FALSE];
  309.    }
  310.       
  311.    [selList free];
  312.    return self;
  313. }
  314.  
  315.  
  316. - windowDidUpdate:(Window *)sender;
  317.     {
  318.     const char    *uname;
  319.     int            i,r,c;
  320.     
  321.     if([NXApp keyWindow]!=[serverNameMatrix window])
  322.         return self;
  323.  
  324.     uname=[newServerName stringValue];
  325.     [serverNameMatrix getNumRows:&r numCols:&c];
  326.     for(i=0;i<r;i++)
  327.         if(!strcmp([[serverNameMatrix cellAt:i:0] stringValue],uname))
  328.             break;
  329.     if(i==r){
  330.         [serverNameMatrix selectCellAt:-1:-1];
  331.         [openButton setEnabled:FALSE];
  332.         [removeButton setEnabled:FALSE];
  333.         //[newServerUser setStringValue:""];
  334.         //[newServerPassword setStringValue:""];
  335.    }
  336.     else{
  337.         ServerCell *aCell=[serverNameMatrix cellAt:i:0];
  338.         [serverNameMatrix selectCellAt:i:0];
  339.       [openButton setEnabled:![aCell isOpen]];
  340.         [removeButton setEnabled:![aCell isOpen]];
  341.         //[newServerUser setStringValue:[aCell user]];
  342.         //[newServerPassword setStringValue:[aCell pass]];
  343.    }
  344.  
  345.     [addButton setEnabled:((i==r)&&(uname[0]!='\0'))];
  346.  
  347.     return self;
  348.     }
  349.         
  350.  
  351. - openOnStartup:sender
  352. {
  353.    id selCell=[serverNameMatrix selectedCell];
  354.  
  355.    if(selCell!=nil){
  356.       [selCell setOpenOnStartup:(BOOL)[newServerOOS state]];
  357.       [selCell writeServerOptions];
  358.    }
  359.    return self;
  360. }
  361.  
  362. - slowLink:sender
  363. {
  364.   id selCell=[serverNameMatrix selectedCell];
  365.  
  366.    if(selCell!=nil){
  367.       [selCell setSlowLink:(BOOL)[newServerSL state]];
  368.       [selCell writeServerOptions];
  369.    }
  370.    return self;
  371. }
  372.  
  373. - (BOOL)menuActive:menuCell
  374. {
  375.    id currentDelegate=[[NXApp mainWindow] delegate];
  376.    BOOL askIfEnable=[currentDelegate isKindOf:[MainWindowControl class]];
  377.    BOOL menuEnabled=[menuCell isEnabled];
  378.    BOOL enable;
  379.  
  380.    if(askIfEnable==TRUE){
  381.       const char *menuTitle=[menuCell title];
  382.       const char *action=[actionTable valueForStringKey:menuTitle];
  383.       if(action!=NULL){
  384.          if(strcmp(action,"sorting")==0)
  385.             enable=[currentDelegate sortCellEnabled:menuCell];
  386.          else if(strcmp(action,"viewselector")==0)
  387.             enable=[currentDelegate selectViewCellEnabled:menuCell];
  388.          else if(strcmp(action,"headerfield")==0)
  389.             enable=[currentDelegate headermodeCellEnabled:menuCell];
  390.          else{
  391.             SEL aSel=sel_getUid(action);
  392.             int e=(int)[currentDelegate perform:aSel];
  393.             enable=(e==1);
  394.             if(enable&&([menuCell action]==@selector(killAuthor:)))
  395.                enable=[currentDelegate killAuthorEnabled];
  396.          }
  397.       }
  398.       else
  399.          enable=TRUE;
  400.    }
  401.    else
  402.       enable=FALSE;
  403.  
  404.    if(enable!=menuEnabled){
  405.       [menuCell setEnabled:enable];
  406.       return TRUE;
  407.    }
  408.    return FALSE;
  409. }
  410.  
  411. - addServerToDefaultDB:(const char *)name
  412. {
  413.    char *buf;
  414.    const char *server=[NXApp defaultValue:"NNTPServer"];
  415.    
  416.    if((server==NULL)||(server[0]=='\0')){
  417.       [NXApp setDefault:"NNTPServer" to:name];
  418.       return self;
  419.    }
  420.    buf=(char *)malloc((strlen(name)+strlen(server)+2)*sizeof(char));
  421.    strcpy(buf,server);
  422.    if(server!=NULL)
  423.       strcat(buf," ");
  424.    strcat(buf,name);
  425.    
  426.    [NXApp setDefault:"NNTPServer" to:buf];
  427.    free(buf);
  428.  
  429.    return self;
  430. }
  431.  
  432. - removeServerFromDefaultDB:(const char *)name
  433. {
  434.    int i;
  435.    char *buf;
  436.    char *tail;
  437.    const char *server=[NXApp defaultValue:"NNTPServer"];
  438.  
  439.    tail=strstr(server,name);
  440.    if(tail!=NULL){
  441.       i=strlen(server)-strlen(tail);
  442.       buf=(char *)malloc(strlen(server)*sizeof(char));
  443.       tail+=strlen(name);
  444.       if(tail[0]==' ')
  445.          tail++;
  446.       else if(i>0)
  447.          i--;
  448.       strncpy(buf,server,i);
  449.       buf[i]='\0';
  450.       strcat(buf,tail);
  451.       [NXApp setDefault:"NNTPServer" to:buf];
  452.       free(buf);
  453.    }
  454.    
  455.    return self;
  456. }
  457.  
  458. - showKillPanel:sender
  459. {
  460.    if(![[[NXApp mainWindow] delegate] isKindOf:[MainWindowControl class]])
  461.       return self;
  462.  
  463.    if(killPanelController==nil)
  464.       if([NXApp loadNibSection:"KillPanel.nib" owner:self withNames:NO]==nil){
  465.          killPanelController=nil;
  466.          return nil;
  467.       }
  468.    [killPanelController showPanel:[NXApp mainWindow]];
  469.    return self;
  470. }
  471.  
  472. - showArticleInspector:sender
  473. {
  474.     static id articleInspector=nil;
  475.     
  476.     if(!articleInspector)
  477.         articleInspector=[[ArticleHeaderController alloc] init];
  478.         
  479.     [[articleInspector window] makeKeyAndOrderFront:self];
  480.         
  481.     return self;
  482. }
  483.  
  484. - setUser:sender
  485. {
  486.    id selCell=[serverNameMatrix selectedCell];
  487.  
  488.    if(selCell!=nil){
  489.       [selCell setUserString:[newServerUser stringValue]];
  490.       [selCell writeServerOptions];
  491.    }
  492.    return self;
  493. }
  494.  
  495. - setPasswd:sender
  496. {
  497.    id selCell=[serverNameMatrix selectedCell];
  498.  
  499.    if(selCell!=nil){
  500.       [selCell setPasswdString:[newServerPassword stringValue]];
  501.       [selCell writeServerOptions];
  502.    }
  503.    return self;
  504. }
  505.  
  506. - newNewsAllServer:sender
  507. {
  508.     int i,j=[nrList count];
  509.     
  510.     for(i=0;i<j;i++)
  511.         [[[nrList objectAt:i] newsgroupSet] newNews:self];
  512.  
  513.     return self;
  514. }
  515.  
  516. - renewNewNewsTimedEntry:sender
  517. {
  518.     int interval;
  519.     
  520.     [self removeNewNewsTimedEntry:self];
  521.         
  522.     interval=[NXApp defaultIntValue:DEFAULT_CHECKNN_PERIOD];
  523.     if(interval>0)
  524.         newNewsTE=DPSAddTimedEntry(interval*60.0,(DPSTimedEntryProc)handler,
  525.                                             self,NX_BASETHRESHOLD);
  526.     
  527.     return self;
  528. }
  529.  
  530. - removeNewNewsTimedEntry:sender
  531. {
  532.     if(newNewsTE){
  533.         DPSRemoveTimedEntry(newNewsTE);
  534.         newNewsTE=0;
  535.     }
  536.     
  537.     return self;
  538. }
  539.  
  540. - performURLService:pboard userData:(const char *)data error:(char **)err
  541. {
  542.     char *buf,*url;
  543.     int length,i,j;
  544.     
  545.     [pboard types];
  546.     [pboard readType:NXAsciiPboardType data:&buf length:&length];
  547.     
  548.     if(length>5){
  549.         id aCell=nil;
  550.         
  551.         url=malloc((length+2)*sizeof(char));
  552.         strncpy(url,buf,length);
  553.         url[length]='\0';
  554.         
  555.         [serverNameMatrix getNumRows:&j numCols:&i];
  556.         for(i=0;i<j;i++){
  557.             id someCell=[serverNameMatrix cellAt:i :0];
  558.             if([someCell isOpen]){
  559.                 aCell=someCell;
  560.                 break;
  561.             }
  562.         }
  563.         
  564.         if(aCell){
  565.             id mc=nil;
  566.             for(i=0,j=[nrList count];i<j;i++){
  567.                 id aMainController=[nrList objectAt:i];
  568.                 if(!strcmp([[aMainController nntpServer] serverName],
  569.                                 [aCell stringValue])){
  570.                     mc=aMainController;
  571.                     break;
  572.                 }
  573.             }
  574.             [[mc newsgroupSet] selectURL:url];
  575.         }
  576.         else
  577.             NXRunAlertPanel("Service","Can't select article. No connection to any server.",NULL,NULL,NULL);
  578.             
  579.         free(url);
  580.     }
  581.     else
  582.         NXRunAlertPanel("Service","No valid URL.",NULL,NULL,NULL);
  583.         
  584.     [pboard deallocatePasteboardData:buf length:length];
  585.  
  586.     return self;
  587. }
  588.     
  589. @end
  590.